package Leetcode;
import java.util.*;

/* 一个数组的 异或总和 定义为数组中所有元素按位 XOR 的结果；如果数组为 空 ，则异或总和为 0 。
(例如，数组 [2,5,6] 的 异或总和 为 2 XOR 5 XOR 6 = 1 。)

给你一个数组 nums ，请你求出 nums 中每个 子集 的 异或总和 ，计算并返回这些值相加之 和 。

注意：在本题中，元素 相同 的不同子集应 多次 计数。

数组 a 是数组 b 的一个 子集 的前提条件是：从 b 删除几个（也可能不删除）元素能够得到 a 。

 

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/sum-of-all-subset-xor-totals
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。*/
public class Leetcode1863 {
	public static void main(String[] args) {
		
	}
}

class Solution {
    public int subsetXORSum(int[] nums) {	//从前向后遍历，先存入第一个数字在可变数组中，从第二个数字开始对可变数组中的数字一个一个进行取^，并存入。在遍历完可变数组后，再存入第二个数字。
    	List <Integer> a = new ArrayList<Integer>(); //先维护一个可变数组
    	int n = nums.length;
    	a.add(nums[0]);
    	for(int i=1;i<n;i++) {	//遍历nums数组（原数组）
    		int len = a.size();	//实时更新可变数组的长度
    		for(int j=0;j<len;j++) {	//对可变数组进行遍历
    			a.add(nums[i]^a.get(j));	//用原数组中的数字对可变数组中的数字取异或
    		}
    		a.add(nums[i]);	//对可变数组遍历完后，结尾再加入主数组的数字
    	}
    	int all=0;
    	for(int c : a) {
    		all+=c;
    	}
    	return all;
    }
}
